package com.xtt._03_NIO;

import org.junit.Test;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * @Author xtt.
 * @Description: channel buffer
 * @Date:Create in 2017/9/21 0021 下午 22:26
 * @Modify By:
 */
public class ChannelAndBufferTest {

    /**
     * 读取文件
     * @throws FileNotFoundException
     */
    @Test
    public void testChannel() throws IOException {
        /*使用Buffer读写数据一般遵循以下四个步骤：
          1.写入数据到Buffer
          2.调用flip()方法
          3.从Buffer中读取数据
          4.调用clear()方法或者compact()方法
            当向buffer写入数据时，buffer会记录下写了多少数据。
            一旦要读取数据，需要通过flip()方法将Buffer从写模式切换到读模式。
            在读模式下，可以读取之前写入到buffer的所有数据。
            一旦读完了所有的数据，就需要清空缓冲区，让它可以再次被写入。
            有两种方式能清空缓冲区：调用clear()或compact()方法。
            clear()方法会清空整个缓冲区。compact()方法只会清除已经读过的数据。
            任何未读的数据都被移到缓冲区的起始处，新写入的数据将放到缓冲区未读数据的后面。*/

        RandomAccessFile file = new RandomAccessFile("src/main/java/com/xtt/_03_NIO/test.txt", "rw");
        System.out.println(file.length());
        FileChannel channel = file.getChannel();
        ByteBuffer buf = ByteBuffer.allocate(1024);
        int read = channel.read(buf);///read into buffer.
        while(read != -1) {
            System.out.println("read:"+read);
            buf.flip();
            while(buf.hasRemaining()) {
                System.out.println((char)buf.get());//// read 1 byte at a time
            }
            buf.clear();////make buffer ready for writing
            read = channel.read(buf);
        }
        file.close();
    }

}
